package day20170505.ch01;

/**
 * 链表的数据结构
 * @author 罗智壕-13424431416
 *
 * 2017年5月5日
 */
public class LinkList {
	
	/**
	 * 链表的头节点
	 */
	private Node head;
	
	/**
	 * 构造方法
	 * @param head
	 */
	public LinkList(Node head) {
		this.head = head;
	}

	/**
	 * 增加一个节点
	 * @param node
	 */
	public void addNode(Node node){
		
		//每次都从头部开始循环
		Node temp = this.head;
		
		while(true){
			
			//如果当前节点的下一个节点是null，代表是最后一个
			if(null == temp.getNext()){
				//存入传进来的节点
				temp.setNext(node);
				//结束死循环
				break;
			}
			
			//如果上面条件不满足，把指针指向下一个节点
			temp = temp.getNext();
		}
	}
	
	/**
	 * 查询节点
	 */
	public void findNode(){
		//每次都从头部开始循环
		Node temp = this.head.getNext();
		StringBuffer buffer = new StringBuffer();
		while(true){
			
			//如果当前节点的下一个节点是null，代表是最后一个
			if(null == temp.getNext()){
				buffer = buffer.append("-->").append(temp.getValue());
				//结束死循环
				break;
			}else{
				buffer = buffer.append("-->").append(temp.getValue());
			}
			
			//如果上面条件不满足，把指针指向下一个节点
			temp = temp.getNext();
		}
		System.out.println(buffer);
	}
	
	/**
	 * 插入节点
	 * @param insertNode	需要插入的节点
	 * @param parentNode	需要插入到节点的前面一个节点
	 */
	public void insertNode(Node insertNode,Node parentNode){
		//获取头部节点
		Node temp = this.head;
		while(true){
			//防止空指针
			if(null != temp){
				
				//拿到下一个节点
				temp = temp.getNext();
				
				//如果parentNode里面的值等于当前节点的值得话，代表找到了
				if(temp.getValue() == parentNode.getValue()){
					//把当前节点的next赋值给insertNode的next
					insertNode.setNext(parentNode.getNext());
					//再把当前节点的指针指向插入的节点insertNode
					parentNode.setNext(insertNode);
					break;
				}
			}else{
				//如果是空，代表已经是尾部了
				break;
			}
		}
	}
	
	/**
	 * 删除节点
	 * @param deleteNode	需要删除的节点
	 */
	public void deleteNode(Node deleteNode){
		//获取头部
		Node temp = this.head;
		while(true){
			if(null != temp){
				//如果当前节点的下一个节点的值 等于 需要删除的值
				if(temp.getNext().getValue() == deleteNode.getValue()){
					//那就把当前节点指向当前节点的下下个节点（因为下个节点就是你要删除的节点）
					temp.setNext(temp.getNext().getNext());
					//如果删除完就直接break;
					break;
				}
				//如果没有找到就获取下一个节点
				temp = temp.getNext();
			}else{
				//如果temp是空代表是末尾了
				break;
			}
		}
	}
}
